#include <windows.h>
#include <iostream>

// 全局变量存储信号量句柄
HANDLE g_hSemaphore;

// 子线程函数
DWORD WINAPI ThreadFunc(LPVOID lpParam) {
	std::cout << "子线程开始执行..." << std::endl;
	// 模拟一些工作
	Sleep(2000);  // 假设子线程需要2秒完成任务
	std::cout << "子线程已完成任务." << std::endl;
	
	// 释放信号量以通知父线程
	if (!ReleaseSemaphore(g_hSemaphore, 1, NULL)) {
		std::cerr << "释放信号量失败: " << GetLastError() << std::endl;
		return 1;
	}
	
	return 0;
}

int main() {
	// 创建信号量，初始计数为0，最大计数为1
	g_hSemaphore = CreateSemaphore(NULL, 0, 1, NULL);
	if (g_hSemaphore == NULL) {
		std::cerr << "创建信号量失败: " << GetLastError() << std::endl;
		return 1;
	}
	
	// 创建子线程
	HANDLE hThread = CreateThread(NULL, 0, ThreadFunc, NULL, 0, NULL);
	if (hThread == NULL) {
		std::cerr << "创建线程失败: " << GetLastError() << std::endl;
		CloseHandle(g_hSemaphore);
		return 1;
	}
	
	std::cout << "父线程正在等待子线程完成..." << std::endl;
	
	// 父线程等待信号量
	DWORD dwWaitResult = WaitForSingleObject(g_hSemaphore, INFINITE);
	switch (dwWaitResult) {
	case WAIT_OBJECT_0:
		std::cout << "父线程收到信号量，子线程已完成." << std::endl;
		break;
	default:
		std::cerr << "等待信号量失败: " << GetLastError() << std::endl;
		break;
	}
	
	// 清理资源
	CloseHandle(hThread);
	CloseHandle(g_hSemaphore);
	
	return 0;
}




